#include "AsyncFileLoader.h"
#include "FunTrace.h"

CAsyncFileLoader* CAsyncFileLoader::NewLC()
	{
	TFunTrace funTrace(__PRETTY_FUNCTION__);
	CAsyncFileLoader* obj = new (ELeave) CAsyncFileLoader;
	CleanupStack::PushL(obj);
	obj->ConstructL();
	return obj;
	}
CAsyncFileLoader* CAsyncFileLoader::NewL()
	{
	TFunTrace funTrace(__PRETTY_FUNCTION__);
	CAsyncFileLoader* obj = CAsyncFileLoader::NewLC();
	CleanupStack::Pop(obj);
	return obj;
	}

void CAsyncFileLoader::ConstructL()
	{
	TFunTrace funTrace(__PRETTY_FUNCTION__);
	iFileHelper = CActiveHelper<RFile*>::NewL(CActive::EPriorityIdle);	
	iBuf.CreateL(0);
	}

CAsyncFileLoader::CAsyncFileLoader()
	{
	TFunTrace funTrace(__PRETTY_FUNCTION__);
	}
CAsyncFileLoader::~CAsyncFileLoader()
	{
	TFunTrace funTrace(__PRETTY_FUNCTION__);
	delete iFileHelper;
	iFile.Close();
	iBuf.Close();
	}
TInt CAsyncFileLoader::LoadFileL(RFs& aFs, const TDesC& aFileName, MAsyncFileLoaderCallback* aTarget, TInt aSeekOffset, TInt aLength)
	{
	TFunTrace funTrace(__PRETTY_FUNCTION__);
	iTarget = aTarget;
	iFile.Close();
	TInt ret = iFile.Open(aFs, aFileName, EFileRead);
	if(ret != KErrNone) return ret;
	TInt length = aLength;
	if(length == -1)
		{
		iFile.Size(length);
		length -= aSeekOffset;
		}
	if(aSeekOffset)
		iFile.Seek(ESeekStart, aSeekOffset);
	if(length > iBuf.MaxLength())
		iBuf.ReAllocL(length);
	iFile.Read(iBuf, length, iFileHelper->iStatus);
	iFileHelper->SetActive(this, &iFile);
	iLoading = ETrue;
	return ret;
	}
void CAsyncFileLoader::Cancel()
	{
	TFunTrace funTrace(__PRETTY_FUNCTION__);
		iFileHelper->Cancel();
	}

TBool CAsyncFileLoader::Loading() const
{
TFunTrace funTrace(__PRETTY_FUNCTION__);
	return iLoading;
}

void CAsyncFileLoader::MActiveHelperCallbackRunL(CActiveHelper<RFile*>* aActiveHelper, RFile* aUserData)
	{
	TFunTrace funTrace(__PRETTY_FUNCTION__);
	iLoading = EFalse;
	if(iTarget)
		iTarget->MAsyncFileLoaderCallbackRunL(this, iFileHelper->iStatus.Int(), iBuf);
	}
TInt CAsyncFileLoader::MActiveHelperCallbackRunError(CActiveHelper<RFile*>* aActiveHelper, RFile* aUserData, TInt aError)
	{
	TFunTrace funTrace(__PRETTY_FUNCTION__);
	
	}
void CAsyncFileLoader::MActiveHelperCallbackDoCancel(CActiveHelper<RFile*>* aActiveHelper, RFile* aUserData)
	{
	TFunTrace funTrace(__PRETTY_FUNCTION__);
	iFile.ReadCancel(iFileHelper->iStatus);	
	}
